package ar.com.cubika.trainees.bean.transportes;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Representa cada ruta que usa la empresa para sus viajes
 * 
 * @author Carlos
 */
public class Ruta {
    private String origen;
    private String destino;
    private long kmBuenCamino;
    private long kmMalCamino;
    
    private boolean conPeajes;
    
    private boolean nacional;
    private boolean privada;
    private boolean provincial;
    
    private List<String> urls; 
    
    private static Map<List<String>,Ruta> rutasRegistradas;
    private static List<Ruta> rutas;
    
    private static Map<List<String>,Ruta> getRutasRegistradas() {
        if (rutasRegistradas == null) {
            clearRutasRegistradas();
        }
        return rutasRegistradas;
    }
    
    private static List<String> getRutaKey(String origen, String destino) {
        return Arrays.asList(new String[] {origen, destino});
    }

    /**
     * Le indico a la clase Ruta que agregue una Ruta a su catalogo de
     * rutas registradas.
     * @see getRutaEntre(String,String)
     */
    public static synchronized void registrarRuta(Ruta ruta) {
        getRutas().add(ruta);
        getRutasRegistradas().put(getRutaKey(ruta.getOrigen(),ruta.getDestino()), ruta);
    }

    /**
     * La ruta registrada entre dos ciudades, <code>null</code> si no hay ninguna
     */
    public static synchronized Ruta getRutaEntre(String ciudad1, String ciudad2) {
        Ruta ruta = getRutasRegistradas().get(getRutaKey(ciudad1, ciudad2));
        if (ruta == null) {
            ruta = getRutasRegistradas().get(getRutaKey(ciudad2, ciudad1));
        }
        return ruta;
    }

    /**
     * Limpia el registro de rutas
     */
    public static synchronized void clearRutasRegistradas() {
        rutasRegistradas = new HashMap<List<String>,Ruta>();
    }
    
    public static synchronized Collection<Ruta> getRutas() {
        if (rutas == null) {
            rutas = new ArrayList<Ruta>();
        }
        return rutas;
    }

    
    /**
     * Constructor con los extremos de la ruta
     */
    public Ruta(String origen, String destino) {
        this.origen = origen;
        this.destino = destino;
        this.urls = new ArrayList<String>();
        this.nacional = false;
        this.privada = false;
        this.provincial = false;
    }
    
    /**
     * El lugar donde empieza la ruta 
     */
    public String getOrigen() {
        return origen;
    }
    
    /**
     * El lugar de destino 
     */
    public String getDestino() {
        return destino;
    }
    
    /**
     * La cantidad de km de ruta en buen estado
     */
    public long getKmBuenCamino() {
        return kmBuenCamino;
    }
    
    /**
     * La cantidad de km de ruta en mal estado
     */
    public long getKmMalCamino() {
        return kmMalCamino;
    }

    /**
     * La cantidad total de km de la ruta 
     */
    public long getKm() {
        return this.getKmBuenCamino() + this.getKmMalCamino();
    }

    /**
     * True si la ruta incluye, al menos, un peaje
     */
    public boolean isConPeajes() {
        return conPeajes;
    }

    /**
     * True si la ruta depende del estado nacional
     */
    public boolean isNacional() {
        return nacional;
    }

    /**
     * True si la ruta depende de un estado provincial
     */
    public boolean isPrivada() {
        return privada;
    }

    /**
     * True si la ruta es, en realidad, un camino privado
     */
    public boolean isProvincial() {
        return provincial;
    }

    
    public void setConPeajes(boolean conPeajes) {
        this.conPeajes = conPeajes;
    }

    public void setNacional(boolean nacional) {
        this.nacional = nacional;
    }

    public void setPrivada(boolean privada) {
        this.privada = privada;
    }

    public void setProvincial(boolean provincial) {
        this.provincial = provincial;
    }

    public void setKmBuenCamino(long kmBuenCamino) {
        this.kmBuenCamino = kmBuenCamino;
    }
    
    public void setKmMalCamino(long kmMalCamino) {
        this.kmMalCamino = kmMalCamino;
    }
    
    
    public String toString() {
        return "Ruta " + this.getOrigen() + "-" + this.getDestino() 
            + " (" + this.getKmBuenCamino() + "b/"
            + this.getKmMalCamino() + "m)";
    }

    public List<String> getUrls() {
        return this.urls;
    }
    
    public void addUrl(String url) {
        this.urls.add(url);
    }

	public static void setRutas(List<Ruta> rutas) {
		Ruta.rutas = rutas;
	}

	public void setUrls(List<String> urls) {
		this.urls = urls;
	}
}
